package com.ruoyi.business.controller;

import io.swagger.annotations.ApiOperation;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import springfox.documentation.annotations.ApiIgnore;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.business.domain.SchoolProjectStandard;
import com.ruoyi.business.service.ISchoolProjectStandardService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 学校项目标准Controller
 * 
 * @author lcz
 * @date 2025-02-23
 */
@ApiIgnore
@RestController
@RequestMapping("/business/schoolProjectStandard")
public class SchoolProjectStandardController extends BaseController
{
    @Autowired
    private ISchoolProjectStandardService schoolProjectStandardService;

    /**
     * 查询学校项目标准列表
     */
    @ApiOperation("查询学校项目标准列表")
//    @PreAuthorize("@ss.hasPermi('business:schoolProjectStandard:list')")
    @GetMapping("/list")
    public TableDataInfo list(SchoolProjectStandard schoolProjectStandard)
    {
        startPage();
        List<SchoolProjectStandard> list = schoolProjectStandardService.selectSchoolProjectStandardList(schoolProjectStandard);
        return getDataTable(list);
    }

    /**
     * 导出学校项目标准列表
     */
    @ApiOperation("导出学校项目标准列表")
//    @PreAuthorize("@ss.hasPermi('business:schoolProjectStandard:export')")
    @Log(title = "学校项目标准", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, SchoolProjectStandard schoolProjectStandard)
    {
        List<SchoolProjectStandard> list = schoolProjectStandardService.selectSchoolProjectStandardList(schoolProjectStandard);
        ExcelUtil<SchoolProjectStandard> util = new ExcelUtil<SchoolProjectStandard>(SchoolProjectStandard.class);
        util.exportExcel(response, list, "学校项目标准数据");
    }

    /**
     * 获取学校项目标准详细信息
     */
    @ApiOperation("获取学校项目标准详细信息")
//    @PreAuthorize("@ss.hasPermi('business:schoolProjectStandard:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id)
    {
        return success(schoolProjectStandardService.selectSchoolProjectStandardById(id));
    }

    /**
     * 新增学校项目标准
     */
    @ApiOperation("新增学校项目标准")
//    @PreAuthorize("@ss.hasPermi('business:schoolProjectStandard:add')")
    @Log(title = "学校项目标准", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody SchoolProjectStandard schoolProjectStandard)
    {
        if (ObjectUtils.isEmpty(schoolProjectStandard.getGradeId())){
            return AjaxResult.error("等级id不能为空");
        }
        if (ObjectUtils.isEmpty(schoolProjectStandard.getProjectType())){
            return AjaxResult.error("项目类型不能为空");
        }
        if (ObjectUtils.isEmpty(schoolProjectStandard.getSingleScore())){
            return AjaxResult.error("单项得分不能为空");
        }
        return toAjax(schoolProjectStandardService.insertSchoolProjectStandard(schoolProjectStandard));
    }

    /**
     * 修改学校项目标准
     */
    @ApiOperation("修改学校项目标准")
//    @PreAuthorize("@ss.hasPermi('business:schoolProjectStandard:edit')")
    @Log(title = "学校项目标准", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody SchoolProjectStandard schoolProjectStandard)
    {
        return toAjax(schoolProjectStandardService.updateSchoolProjectStandard(schoolProjectStandard));
    }

    /**
     * 删除学校项目标准
     */
    @ApiOperation("删除学校项目标准")
//    @PreAuthorize("@ss.hasPermi('business:schoolProjectStandard:remove')")
    @Log(title = "学校项目标准", businessType = BusinessType.DELETE)
	@DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids)
    {
        return toAjax(schoolProjectStandardService.deleteSchoolProjectStandardByIds(ids));
    }

    /**
     * 导入接口
     */
    @ApiOperation("后台----导入学校项目标准")
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception {
        InputStream inputStream = file.getInputStream();
        ExcelUtil<SchoolProjectStandard> util = new ExcelUtil<>(SchoolProjectStandard.class);
        List<SchoolProjectStandard> projectStandardList = util.importExcel(inputStream);
        List<SchoolProjectStandard> dataList = schoolProjectStandardService.selectSchoolProjectStandardList(new SchoolProjectStandard());
        //TODO: 比较两个列表，以项目类型、性别、单项得分为组合键，找出projectStandardList中有多少数据是dataList中存在的，并返回这些数据的行号

        // 用于存储重复数据的行号
        List<Integer> duplicateRowNumbers = new ArrayList<>();

        try{
            // 创建一个映射，用于快速查找dataList中是否存在相同的组合键
            Map<String, SchoolProjectStandard> existingDataMap = dataList.stream()
                    .collect(Collectors.toMap(
                            ps -> ps.getProjectType() + "-" + ps.getGender() + "-" + ps.getSingleScore(),
                            ps -> ps
                    ));

            // 遍历导入的projectStandardList，检查是否存在重复数据
            for (int i = 0; i < projectStandardList.size(); i++) {
                SchoolProjectStandard projectStandard = projectStandardList.get(i);
                String key = projectStandard.getProjectType() + "-" + projectStandard.getGender() + "-" + projectStandard.getSingleScore();
                if (existingDataMap.containsKey(key)) {
                    // 如果存在重复，记录行号（注意：Excel行号从1开始，i从0开始，所以需要加2）
                    duplicateRowNumbers.add(i + 2); // 假设第一行为标题行
                }
            }
        }catch (Exception e){
            return AjaxResult.error("导入失败,请检查:项目类型、性别、单项得分 是否为正确值");
        }

        // 如果有重复数据，返回错误信息和重复的行号
        if (!duplicateRowNumbers.isEmpty()) {
            return AjaxResult.error("以下行号的数据已存在：" + duplicateRowNumbers.toString());
        }

        if (projectStandardList.size() > 0){
            for (SchoolProjectStandard projectStandard : projectStandardList){
                schoolProjectStandardService.insertSchoolProjectStandard(projectStandard);
            }
        }
        return AjaxResult.success();
    }

    /** 前端接口 ***************************************************************************************************/
    /** 前端接口 ***************************************************************************************************/
    /** 前端接口 ***************************************************************************************************/

//    /**
//     * 查询学校项目标准列表
//     * 接口路径：/schoolProjectStandard/front/list
//     */
//    @GetMapping("/front/list")
//    @ApiOperation("前台查询学校项目标准列表")
//    public TableDataInfo<SchoolProjectStandard> frontList(SchoolProjectStandard schoolProjectStandard)
//    {
//        startPage();
//        List<SchoolProjectStandard> list = schoolProjectStandardService.selectSchoolProjectStandardList(schoolProjectStandard);
//        return getDataTable(list);
//    }
//
//    /**
//     * 获取学校项目标准详细信息
//     * 接口路径：/schoolProjectStandard/front/info
//     */
//    @ApiOperation("前台获取学校项目标准详细信息")
//    @GetMapping(value = "/front/info")
//    public R<SchoolProjectStandard> frontInfo(@RequestParam("id") Long id)
//    {
//        return R.ok(schoolProjectStandardService.selectSchoolProjectStandardById(id));
//    }
//
//    /**
//     * 新增学校项目标准
//     * 接口路径：/schoolProjectStandard/front/add
//     */
//    @ApiOperation("前台新增学校项目标准")
//    @PostMapping("/front/add")
//    public AjaxResult frontAdd(@RequestBody SchoolProjectStandard schoolProjectStandard)
//    {
//        return toAjax(schoolProjectStandardService.insertSchoolProjectStandard(schoolProjectStandard));
//    }
//
//    /**
//     * 修改学校项目标准
//     * 接口路径：/schoolProjectStandard/front/edit
//     */
//    @ApiOperation("前台修改学校项目标准")
//    @PostMapping("/front/edit")
//    public AjaxResult frontEdit(@RequestBody SchoolProjectStandard schoolProjectStandard)
//    {
//        return toAjax(schoolProjectStandardService.updateSchoolProjectStandard(schoolProjectStandard));
//    }
//
//    /**
//     * 删除学校项目标准
//     * 接口路径：/schoolProjectStandard/front/delete
//     */
//    @ApiOperation("前台删除学校项目标准")
//    @GetMapping("/front/delete")
//    public AjaxResult frontRemove(@RequestParam Long[] ids)
//    {
//        return toAjax(schoolProjectStandardService.deleteSchoolProjectStandardByIds(ids));
//    }
}
